#!/usr/bin/env python3
"""
生成PPT演示文稿的脚本
将Markdown转换为PowerPoint格式
"""

import os
import sys
from pathlib import Path

# 检查是否安装了python-pptx
try:
    from pptx import Presentation
    from pptx.util import Inches, Pt
    from pptx.enum.text import PP_ALIGN
    from pptx.dml.color import RGBColor
except ImportError:
    print("请先安装python-pptx库:")
    print("pip install python-pptx")
    sys.exit(1)

def create_agent_presentation():
    """创建AI Agent演示PPT"""
    
    # 创建演示文稿
    prs = Presentation()
    
    # 设置幻灯片大小（16:9）
    prs.slide_width = Inches(13.33)
    prs.slide_height = Inches(7.5)
    
    # 1. 标题页
    slide_layout = prs.slide_layouts[0]  # 标题布局
    slide = prs.slides.add_slide(slide_layout)
    title = slide.shapes.title
    subtitle = slide.placeholders[1]
    
    title.text = "AI Agent 系统搭建详解"
    subtitle.text = "从零到一构建智能代理系统\n\n基于Ollama本地模型的实践演示"
    
    # 2. 目录页
    slide_layout = prs.slide_layouts[1]  # 内容布局
    slide = prs.slides.add_slide(slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "演讲目录"
    content.text = """1. 什么是AI Agent？
2. 系统架构设计
3. 核心组件实现
4. 工具调用机制
5. 本地模型集成
6. 实战演示
7. 扩展与优化"""
    
    # 3. 什么是AI Agent
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "什么是AI Agent？"
    content.text = """• 智能代理：能够感知环境、做出决策、执行行动的自主系统

• 核心特征：
  - 自主性：独立运行和决策
  - 反应性：响应环境变化
  - 主动性：主动执行任务
  - 社会性：与用户和其他系统交互

• 工作循环：
  感知 → 思考 → 行动 → 反馈

• 应用场景：
  🤖 智能客服  📊 数据分析  🛠️ 自动化运维  📝 内容创作"""
    
    # 4. 系统架构设计
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "系统架构设计"
    content.text = """核心组件：

• Agent核心：统一调度和流程控制
• 推理引擎：意图分析和策略制定
• 记忆系统：短期和长期记忆管理
• 工具系统：可插拔的功能模块
• 任务规划器：复杂任务分解和执行

设计原则：
• 模块化：各组件独立，便于扩展
• 可插拔：工具和模型可灵活替换
• 异步处理：支持高并发操作
• 错误恢复：完善的异常处理机制"""
    
    # 5. 核心组件实现 - Agent类
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "核心组件 - Agent类"
    content.text = """class Agent:
    def __init__(self, config: AgentConfig):
        self.reasoning_engine = ReasoningEngine()
        self.memory_system = MemorySystem()
        self.task_planner = TaskPlanner()
        self.tool_registry = ToolRegistry()
    
    async def process_input(self, user_input: str):
        # 1. 分析用户意图
        reasoning_result = await self.reasoning_engine.analyze(...)
        
        # 2. 执行推理计划
        response = await self._execute_reasoning_plan(reasoning_result)
        
        # 3. 保存到记忆
        await self.memory_system.store(...)
        
        return response"""
    
    # 6. 工具调用机制
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "工具调用机制"
    content.text = """五步调用流程：

1️⃣ 意图识别：分析用户输入，识别所需工具
2️⃣ 参数提取：从输入中提取工具执行参数
3️⃣ 安全验证：验证参数类型、权限和安全性
4️⃣ 工具执行：调用工具的execute方法
5️⃣ 结果整合：将工具结果整合到最终响应

工具基类设计：
class Tool:
    async def execute(self, **kwargs) -> str:
        raise NotImplementedError
    
    def validate_params(self, **kwargs) -> bool:
        return True"""
    
    # 7. 本地模型集成
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "本地模型集成 - Ollama"
    content.text = """为什么选择本地模型？
✅ 数据隐私：数据不离开本地环境
✅ 成本控制：无API调用费用
✅ 自主可控：不依赖外部服务
✅ 定制化：可针对特定领域优化

Ollama集成方案：
• OpenAI兼容接口：无缝切换
• 异步HTTP客户端：高性能调用
• 灵活配置：支持多种模型

配置示例：
provider: "ollama"
model: "qwen3:8b"
ollama_base_url: "http://localhost:11434" """
    
    # 8. 实战演示
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "实战演示 - 天气查询"
    content.text = """用户输入：北京天气怎么样？

Agent处理流程：
1. 意图识别 → weather
2. 参数提取 → {"city": "北京"}
3. 安全验证 → 通过
4. 工具执行 → weather.execute(city="北京")
5. 结果整合 → 生成自然语言回复

实际输出：
"北京今天天气晴朗，当前温度25°C，
更新时间是2025年09月30日16:28:36。
天气条件适宜，建议可以安排户外活动哦！"

✅ 真实工具调用，不是AI胡编乱造！"""
    
    # 9. 扩展与优化
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "扩展与优化"
    content.text = """功能扩展：
• 添加新工具：邮件发送、数据库查询、API调用
• 增强推理：支持多步骤复杂任务
• 多模态：图像、语音处理能力
• 协作模式：多Agent协同工作

性能优化：
• 并发处理：异步编程提高响应速度
• 缓存机制：缓存频繁使用的结果
• 连接池：复用HTTP连接
• 批量处理：相似请求批量处理

安全性：
• 输入验证、权限控制、审计日志、沙箱执行"""
    
    # 10. 总结页
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "总结与展望"
    content.text = """我们构建了什么？
✅ 完整的AI Agent系统：推理、记忆、工具调用
✅ 本地模型集成：支持Ollama等本地大模型
✅ 可扩展架构：模块化设计，易于添加功能
✅ 实用工具集：计算器、搜索、文件系统、天气

技术亮点：
🧠 智能推理引擎：多步骤分析决策
🔧 灵活工具系统：插件化工具架构
💾 记忆管理：短期和长期记忆结合
🌐 本地化部署：数据安全可控

下一步方向：
🚀 增强推理能力、🛠️ 扩展工具生态
📊 可视化界面、🤝 多Agent协作"""
    
    # 11. Q&A页
    slide = prs.slides.add_slide(prs.slide_layouts[0])
    title = slide.shapes.title
    subtitle = slide.placeholders[1]
    
    title.text = "Q & A"
    subtitle.text = "欢迎提问！\n\n项目地址：/Users/shenjiang/sample-agent\n基于实际可运行的AI Agent系统"
    
    return prs

def main():
    """主函数"""
    print("🎯 生成AI Agent演示PPT...")
    
    try:
        # 创建演示文稿
        presentation = create_agent_presentation()
        
        # 保存文件
        output_path = "/Users/shenjiang/sample-agent/docs/AI_Agent_演示.pptx"
        presentation.save(output_path)
        
        print(f"✅ PPT已生成: {output_path}")
        print(f"📄 共 {len(presentation.slides)} 页幻灯片")
        
        # 同时生成备用的Markdown版本
        md_path = "/Users/shenjiang/sample-agent/docs/agent_presentation.md"
        if os.path.exists(md_path):
            print(f"📝 Markdown版本: {md_path}")
        
        print("\n💡 使用提示:")
        print("1. 可以直接用PowerPoint打开.pptx文件")
        print("2. 也可以参考.md文件进行自定义修改")
        print("3. 建议根据实际演讲时长调整内容详细程度")
        
    except Exception as e:
        print(f"❌ 生成PPT时发生错误: {e}")
        print("请确保已安装 python-pptx 库: pip install python-pptx")

if __name__ == "__main__":
    main()